<?php

/**
 * alltosun.com  cup_helper.php
 * ============================================================================
 * 版权所有 (C) 2009-2013 北京互动阳光科技有限公司，并保留所有权利。
 * 网站地址: http://www.alltosun.com
 * ----------------------------------------------------------------------------
 * 许可声明：这是一个开源程序，未经许可不得将本软件的整体或任何部分用于商业用途及再发布。
 * ============================================================================
 * $Author: 王德康 (wangdk@alltosun.com) $
 * $Date: 2015-12-22 下午5:59:49 $
 * $Id: cup_helper.php 166889 2016-02-29 07:09:19Z wangdk $
 *
 */
class cup_helper
{
    /**
     * 根据进货箱数获取所需要的杯子类型和数量
     * @param unknown_type $user_id 用户ID
     * @param unknown_type $box_num 散装进货的数量(箱)
     * @param unknown_type $arr_scale 杯型比例 array(1=>10, 2=>20, 3=>24, 4=>10, 5=>10, 6=>20); 6纸袋子，纸袋子前三次超发，但是不减库存
     * @param unknown_type $is_double 是否超发  * 3
     * @param unknown_type $is_store 店铺ID
     *
     * @example
     *     box_num       爆米花箱数
     *     box_cup_num   一箱爆米花需要杯子的数量
     *     cup_num       总计需要的杯子数量
     *
     *     cup2box_num      共计需要多少箱杯子
     *     box2cup_num      一箱杯子的数量
     *
     *     true_cup2box_num 实际发货需要多少箱杯子
     *     true_cup_num     实际发货的杯子数量
     *
     *     excess_num       当前超发多少杯子
     *     less_cup_num 否扣掉之前超发杯子数量
     *     store_excess_num 用户超发杯子的数量
     */
    public static function get_app_dealer_cup_num($store_id, $box_num, $arr_scale = array(), $is_double = 0, $is_store = 0) {

        if (!$arr_scale) {
            $arr_scale = self::get_order_default_cup_num($box_num);
        }

        // 客户所选杯型和数据
        $data = self::get_dealer_data($arr_scale, $is_double);

        if ($is_store) {
            // zhangyh update 20151230 终端获取经销商的杯子库存
            $store_info = store_helper::get_agency_store($store_id);
            if (!isset($store_info['id'])) {
                return false;
            }
            $data = self::format_num($data, $store_info['id']);
        }

        // 先使用超发的数据
        if (!$is_double) {
            $data = self::get_true_dealer_data($store_id, $data);
        }

        return $data;
    }

    /**
     * 根据进货箱数获取所需要的杯子类型和数量
     * @param unknown_type $user_id 用户ID
     * @param unknown_type $box_num 散装进货的数量(箱)
     * @param unknown_type $arr_scale 杯型比例 array(1=>10, 2=>20, 3=>24, 4=>10, 5=>10, 6=>20); 6纸袋子，纸袋子前三次超发，但是不减库存
     * @param unknown_type $is_double 是否超发  * 3
     * @param unknown_type $is_store 是否商户进货选择杯子
     *
     * @example
     *     box_num       爆米花箱数
     *     box_cup_num   一箱爆米花需要杯子的数量
     *     cup_num       总计需要的杯子数量
     *
     *     cup2box_num      共计需要多少箱杯子
     *     box2cup_num      一箱杯子的数量
     *
     *     true_cup2box_num 实际发货需要多少箱杯子
     *     true_cup_num     实际发货的杯子数量
     *
     *     excess_num       当前超发多少杯子
     *     less_cup_num 否扣掉之前超发杯子数量
     *     store_excess_num 用户超发杯子的数量
     */
    public static function get_dealer_cup_num($store_id, $box_num, $arr_scale = array(), $is_double = 0, $is_store = 0) {

        if (!$arr_scale) {
            $arr_scale = self::get_order_default_cup_num($box_num);
        }

        if (!self::check_num($box_num, $arr_scale)) {
            return array('info' => '比例分配和订单总箱数不匹配!');
        }

        // 客户所选杯型和数据
        $data = self::get_dealer_data($arr_scale, $is_double);

        // zhangyh update 20151230 经销商不需要返回自己的库存
        if ($is_store) {
            $data = self::format_num($data, $store_id);
        }

        // 先使用超发的数据
        if (!$is_double) {
            $data = self::get_true_dealer_data($store_id, $data);
        }

        return $data;
    }

    /**
     * 增加经销商的库存
     * @param unknown_type $data
     * @param unknown_type $store_id
     * @return unknown
     */
    private static function format_num($data, $store_id) {
        $excess_list = self::get_user_excess_num($store_id);
        // 当前用户未有之前未有超发库存
        if (!$excess_list) {
            return $data;
        }

        foreach ($excess_list as $k => $v) {
            $cup_type = $v['cup_type'];

            if (!isset($data[$cup_type])) {
                continue;
            }

            $data[$cup_type]['store_cup_num'] = $v['cup_num'];
        }
        return $data;
    }

    /**
     * 根据用户超发库存计算实际发货的杯子数量
     * @param unknown_type $user_id
     * @param unknown_type $data
     * @return unknown
     */
    private static function get_true_dealer_data($store_id, $data) {
        if (!$data) {
            return false;
        }

        $excess_list = self::get_user_excess_num($store_id);
        // 当前用户未有之前未有超发库存
        if (!$excess_list) {
            return $data;
        }

        $cup2box_num = cup_config::$cup2box_num;

        // 1、超发的杯子库存足够一箱
        // 2、真实需要的杯子 - 超发的杯子数量 =整箱
        foreach ($excess_list as $k => $v) {

            $cup_type = $v['cup_type'];
            if (!isset($data[$cup_type])) {
                continue;
            }
            $info = $data[$cup_type];

            $data[$cup_type]['less_cup_num'] = 0;
            $data[$cup_type]['store_excess_num'] = $v['excess_num'];


            // 不是整箱, 6是纸袋子，纸袋子没有超发
            if ($info['cup_num'] % $info['box2cup_num'] != 0 && $cup_type !== 6) {
                // 减少多少杯子可以凑够一箱
                $less_num = $info['cup_num'] % $info['box2cup_num'];
                if ($less_num < $v['excess_num']) {
                    // 舍去整箱的零头
                    $data[$cup_type]['less_cup_num'] = $less_num;
                    $data[$cup_type]['true_cup_num'] = $data[$cup_type]['cup_num'] - $less_num;
                    $data[$cup_type]['true_cup2box_num'] = $data[$cup_type]['true_cup_num'] / $info['box2cup_num'];
                    $data[$cup_type]['excess_num'] = 0;
                }
            }
        }

        return $data;

    }

    /**
     * 获取当前用户的超发数据
     * 前3次订单都会固定超发，三次以后按照超发的补货
     * @param unknown_type $user_id
     */
    public static function get_user_excess_num($store_id) {
        $table = 'user_cup';
        $filter = array('store_id' => $store_id);

        $cup_type_list = _model($table)->getList($filter);
        if (!$cup_type_list) {
            return false;
        }

        return $cup_type_list;
    }

    /**
     * 验证箱数和分配的比例总和是否相等
     * @param unknown_type $box
     * @param unknown_type $arr_scale
     * @return boolean
     */
    private static function check_num($box_num, $arr_scale) {
        return $box_num == array_sum($arr_scale);
    }

    /**
     * 根据默认比例分配每种类型多少箱
     * @param unknown_type $box_num
     * @return boolean|multitype:number
     */
    public static function get_order_default_cup_num($box_num) {
        if (!$box_num) {
            return false;
        }

        // 1、根据进货箱数量和每种杯型的比例，获取每种杯型是多少箱货
        $box2cup_scale = cup_config::$box2cup_scale;

        $arr = array();
        $box_count = count($box2cup_scale);

        foreach ($box2cup_scale as $k => $v) {
            $arr[$k] = floor($v * $box_num);
        }

        // 分配不均衡的情况下都给自动加到超小杯
        if (isset($arr[1])) {
            $arr[1] = $arr[1] + ($box_num - array_sum($arr));
        }

        return $arr;
    }

    /**
     * 计算每箱爆米花对应杯型的数量
     * 计算每种杯子类型的箱数，要配多少杯子
     * @param unknown_type $arr_scale 比例数组
     * @param unknown_type $is_doblue 是否超发
     * @return multitype:number
     */
    private static function get_dealer_data($arr_scale, $is_doblue) {
        $data = array();

        // 杯子类型对应的每箱杯子的数量
        $cup2box_num = cup_config::$cup2box_num;

        // 每一箱货，分别要给每种类型配备多少杯子
        $box2cup_num = cup_config::$box2cup_num;

        foreach ($arr_scale as $key => $val) {

            // 箱子的数量(货)
            $info['box_num'] = $val;

            // 具体发货是，每一箱爆米花需要多少杯子
            $info['box_cup_num'] = $box2cup_num[$key];

            // (杯子)的数量   = 箱子的数量  *  每箱需要多少杯子
            $info['cup_num'] = $val * $box2cup_num[$key];

            // 需要多少箱杯子
            $info['cup2box_num'] = number_format($info['cup_num'] / $cup2box_num[$key], 1, '.', '');

            // 具体发货，是一箱子杯子是多少个
            $info['box2cup_num'] = $cup2box_num[$key];

            // 具体发货多少箱子
            $info['true_cup2box_num'] = ceil($info['cup_num'] / $cup2box_num[$key]);

            // 经销商的杯子的库存
            $info['store_cup_num'] = 0;

            // 超发,纸袋子没有超发
            if ($is_doblue && $key != 6) {
                // 前三笔订单超发倍数
                $is_doblue_num = cup_config::$is_double_num;

                // 真实发货的箱子数量
                $info['true_cup2box_num'] = ceil($info['cup_num'] * $is_doblue_num / $cup2box_num[$key]);
                // 真实发货(杯子)的数量
                $info['true_cup_num'] = $info['true_cup2box_num'] * $cup2box_num[$key];

            } else {
                // 真实发货(杯子)的数量
                $info['true_cup_num'] = $info['true_cup2box_num'] * $cup2box_num[$key];
            }

            // 超发的数量
            $info['excess_num'] = $info['true_cup_num'] - $info['cup_num'];

            $info['less_cup_num'] = 0;
            $info['store_excess_num'] = 0;

            $data[$key] = $info;
        }

        return $data;
    }


    /**
     * 经销商初始化库存，初始化杯子
     * @param unknown_type $store_id
     * @param unknown_type $data
     * @return boolean
     */
    public static function init_store_cup($store_id, $data) {
        $table = 'user_cup';
        $cup2box_num = cup_config::$cup2box_num;

        if (!$data) {
            return false;
        }

        // 已经有杯子库存，更新
        $filter['store_id'] = $store_id;
        $info['store_id'] = $store_id;
        foreach ($data as $k => $v) {
            $info['cup_type'] = $k;

            if (isset($cup2box_num[$k])) {
                $info['cup_num'] = $v * $cup2box_num[$k];

                $filter['cup_type'] = $k;
                $cup_info = _model($table)->read($filter);

                //print_r($info);
                if (!$cup_info) {
                    _model('user_cup')->create($info);

                } else {
                    _model($table)->update($cup_info['id'], array('cup_num' => $info['cup_num']));
                }
            }
        }

        return true;
    }

    /**
     * 经销商初始化库存，初始化杯子
     * @param unknown_type $store_id
     * @param unknown_type $data
     * @return boolean
     * @wangdk 2016-01-29 下午更新，已废弃
     */
    public static function init_store_cup_more($store_id, $data) {
        $table = 'user_cup';
        $cup2box_num = cup_config::$cup2box_num;

        if (!$data) {
            return false;
        }

        // 已经有杯子库存，更新
        $filter['store_id'] = $store_id;
        $cup_list = _model($table)->getList($filter);
        if ($cup_list) {

            foreach ($cup_list as $val) {
                $cup_type = $val['cup_type'];

                if (isset($data[$cup_type])) {
                    $info['cup_num'] = ($data[$cup_type] * $cup2box_num[$cup_type]);
                    _model($table)->update($val['id'], $info);
                }
            }
        } else {
            // 未有老数据，直接保存杯子数据
            $info['store_id'] = $store_id;
            foreach ($data as $key => $val) {
                $info['cup_type'] = $key;

                if (isset($cup2box_num[$key])) {
                    $info['cup_num'] = $val * $cup2box_num[$key];
                }

                _model('user_cup')->create($info);
            }
        }
        return true;
    }

    /**
     * 保存订单杯型数据记录
     * @param unknown_type $order_id
     * @param unknown_type $store_id
     * @param unknown_type $data
     * @param unknown_type $is_store
     * @return boolean
     */
    public static function save_cup_record($order_id, $store_id, $data, $is_store = 0) {

        $info['store_id'] = $store_id;
        $info['order_id'] = $order_id;
        $info['add_time'] = date('Y-m-d H:i:s');

        foreach ($data as $key => $val) {
            $val['cup_type'] = $key;

            if ($is_store) {
                unset($val['excess_num']);
                unset($val['less_cup_num']);
                unset($val['store_excess_num']);
                unset($val['store_cup_num']);
            }

            $info = array_merge($info, $val);
            _model('order_cup')->create($info);
        }

        return true;
    }

    /**
     * 保存商铺的杯型超发和剩余数量
     * @param unknown_type $store_id
     * @param unknown_type $data
     * @return boolean
     */
    public static function save_cup_data($store_id, $data) {
        if (!$data || !$store_id) {
            return false;
        }

        $filter['store_id'] = $store_id;

        foreach ($data as $key => $val) {
            $filter['cup_type'] = $key;

            if ($val['less_cup_num']) {
                // 超发补货，只要保存即可
                self::add_user_cup($filter, 0 - $val['less_cup_num'], $val['true_cup_num']);
            } elseif ($val['excess_num']) {
                // 超发的要累加
                self::add_user_cup($filter, $val['excess_num'], $val['true_cup_num']);
            }
        }

        return true;
    }

    /**
     * 保存用户的超发的杯子数量,更新库存
     * @param unknown_type $filter
     * @param unknown_type $excess_num
     * @param unknown_type 经销商的实际收到的杯子
     * @return boolean
     */
    private static function add_user_cup($filter, $excess_num, $cup_num) {
        $table = 'user_cup';
        $info = _model($table)->read($filter);
        if (!$info) {

            $filter['excess_num'] = $excess_num;
            $filter['cup_num'] = $cup_num;
            return _model($table)->create($filter);

        } else {
            // 超发数量
            $excess_num = $info['excess_num'] + $excess_num;
            $cup_num = $info['cup_num'] + $cup_num;
            return _model($table)->update($filter, array('excess_num' => $excess_num, 'cup_num' => $cup_num));
        }

        return false;
    }

    /**
     * 减少经销商的库存
     * @param unknown_type $order_id
     * @param unknown_type $dealer_id 经销商store_id
     * @return boolean
     */
    public static function less_cup_num($order_id, $dealer_id) {
        if (!$order_id) {
            return false;
        }

        $filter = array(
            'order_id' => $order_id
        );

        $order_cup_list = _model('order_cup')->getList($filter);
        if (!$order_cup_list) {
            return false;
        }

        $table = 'user_cup';

        foreach ($order_cup_list as $k => $v) {
            $order_cup_filter = array(
                'store_id' => $dealer_id,
                'cup_type' => $v['cup_type']
            );
            $cup_info = _model($table)->read($order_cup_filter);
            if ($cup_info) {
                $num = $cup_info['cup_num'] - $v['cup_num'];
                _model($table)->update($order_cup_filter, array('cup_num' => $num));
            }
        }
        return true;
    }

    /**
     * 过滤杯型内空的数据
     * @param  [type] $cup_list [description]
     * @return [type]           [description]
     */
    public static function filter_cup_empty_arr($cup_list) {
        foreach ($cup_list as $key => $value) {
            if (!$value) {
                unset($cup_list[$key]);
            }
        }
        return $cup_list;
    }

    /**
     * 获取订单杯型的数据
     * @param  [type] $order_id [description]
     * @return [type]           [description]
     */
    public static function get_order_cup_data($order_id) {
        $order_cup_list = _model('order_cup')->getList(array('order_id' => $order_id));
        $cup_index_map = array();
        foreach ($order_cup_list as $key => $value) {
            $cup_index_map[$value['cup_type']] = $order_cup_list[$key];
        }
        return $cup_index_map;
    }

    /**
     * 格式化店铺信息，杯子数量 > 200 显示有货
     * @param unknown_type $data
     * @return boolean|string
     */
    public static function format_cup_num($data) {
        if (!$data) {
            return false;
        }
        foreach ($data as $k => $v) {
            if (isset($v['store_cup_num'])) {
                if ($v['store_cup_num'] > 200) {
                    $data[$k]['store_cup_num'] = '有货';
                }
            }
        }
        return $data;
    }

}